/**
 * 平台检测工具
 * 用于统一管理微信小程序、安卓App、H5三端的平台差异
 */

// 平台兼容性工具
export const platform = {
  // 获取当前平台
  getPlatform() {
    // #ifdef H5
    return 'h5';
    // #endif
    
    // #ifdef MP-WEIXIN
    return 'mp-weixin';
    // #endif
    
    // #ifdef APP-PLUS
    return 'app-plus';
    // #endif
    
    // #ifdef MP-ALIPAY
    return 'mp-alipay';
    // #endif
    
    // #ifdef MP-BAIDU
    return 'mp-baidu';
    // #endif
    
    // #ifdef MP-TOUTIAO
    return 'mp-toutiao';
    // #endif
    
    return 'unknown';
  },

  // 检查是否为H5平台
  isH5() {
    return this.getPlatform() === 'h5';
  },

  // 检查是否为微信小程序
  isWeixin() {
    return this.getPlatform() === 'mp-weixin';
  },

  // 检查是否为APP
  isApp() {
    return this.getPlatform() === 'app-plus';
  },

  // 检查是否为小程序（包括微信、支付宝、百度、头条等）
  isMiniProgram() {
    const platform = this.getPlatform();
    return platform.startsWith('mp-');
  },

  // 文件选择（兼容不同平台）
  async chooseFile(options = {}) {
    const defaultOptions = {
      count: 1,
      type: 'all',
      extension: ['.pdf', '.doc', '.docx', '.txt', '.md']
    };

    const finalOptions = { ...defaultOptions, ...options };

    try {
      // #ifdef H5
      // H5环境使用input元素
      return new Promise((resolve, reject) => {
        const input = document.createElement('input');
        input.type = 'file';
        input.accept = finalOptions.extension.join(',');
        input.multiple = finalOptions.count > 1;
        
        input.onchange = (e) => {
          if (e.target.files && e.target.files.length > 0) {
            const files = Array.from(e.target.files).map(file => ({
              name: file.name,
              size: file.size,
              type: file.type,
              path: file.name,
              file: file
            }));
            resolve({ tempFiles: files });
          } else {
            reject(new Error('未选择文件'));
          }
        };
        
        input.onerror = () => {
          reject(new Error('文件选择失败'));
        };
        
        input.click();
      });
      // #endif

      // #ifdef MP-WEIXIN || APP-PLUS
      // 小程序和APP使用uni.chooseFile
      try {
        // 微信小程序优先使用chooseMessageFile
        // #ifdef MP-WEIXIN
        return await uni.chooseMessageFile({
          count: finalOptions.count,
          type: 'file',
          extension: finalOptions.extension.map(ext => ext.replace('.', ''))
        });
        // #endif
        
        // #ifdef APP-PLUS
        return await uni.chooseFile(finalOptions);
        // #endif
      } catch (error) {
        console.log('首选文件选择方法失败，尝试备用方法:', error);
        return await uni.chooseFile(finalOptions);
      }
      // #endif

      // #ifndef H5 || MP-WEIXIN || APP-PLUS
      throw new Error('当前平台不支持文件选择');
      // #endif
    } catch (error) {
      console.error('文件选择失败:', error);
      throw error;
    }
  },

  // 文件上传（兼容不同平台）
  async uploadFile(url, filePath, options = {}) {
    const defaultOptions = {
      name: 'file',
      header: {},
      formData: {}
    };

    const finalOptions = { ...defaultOptions, ...options };

    try {
      // #ifdef H5
      // H5环境需要特殊处理
      if (filePath.file) {
        // 如果有原始文件对象，使用FormData
        const formData = new FormData();
        formData.append(finalOptions.name, filePath.file, filePath.name);
        
        // 添加额外的表单数据
        Object.keys(finalOptions.formData).forEach(key => {
          formData.append(key, finalOptions.formData[key]);
        });

        const response = await fetch(url, {
          method: 'POST',
          headers: finalOptions.header,
          body: formData
        });

        if (!response.ok) {
          throw new Error(`上传失败: ${response.status}`);
        }

        return await response.json();
      }
      // #endif

      // 统一使用uni.uploadFile
      return new Promise((resolve, reject) => {
        const uploadTask = uni.uploadFile({
          url,
          filePath: filePath.path || filePath.tempFilePath || filePath,
          name: finalOptions.name,
          header: finalOptions.header,
          formData: finalOptions.formData,
          success: (res) => {
            if (res.statusCode === 200 || res.statusCode === 201) {
              try {
                const data = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
                resolve(data);
              } catch (e) {
                reject(new Error('服务器响应格式错误'));
              }
            } else {
              reject(new Error(`上传失败: ${res.statusCode}`));
            }
          },
          fail: (error) => {
            reject(new Error(error.errMsg || '网络错误'));
          }
        });

        // 监听上传进度
        if (finalOptions.onProgress && uploadTask) {
          uploadTask.onProgressUpdate((res) => {
            finalOptions.onProgress(res.progress);
          });
        }
      });
    } catch (error) {
      console.error('文件上传失败:', error);
      throw error;
    }
  },

  // 显示Toast（兼容不同平台）
  showToast(options) {
    const defaultOptions = {
      title: '',
      icon: 'none',
      duration: 2000
    };

    const finalOptions = { ...defaultOptions, ...options };

    // #ifdef H5
    // H5环境可能需要特殊处理
    uni.showToast(finalOptions);
    // #endif

    // #ifndef H5
    uni.showToast(finalOptions);
    // #endif
  },

  // 显示Modal（兼容不同平台）
  showModal(options) {
    const defaultOptions = {
      title: '',
      content: '',
      showCancel: true,
      cancelText: '取消',
      confirmText: '确定'
    };

    const finalOptions = { ...defaultOptions, ...options };

    return new Promise((resolve, reject) => {
      uni.showModal({
        ...finalOptions,
        success: (res) => {
          resolve(res);
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  },

  // 获取系统信息
  getSystemInfo() {
    return new Promise((resolve, reject) => {
      uni.getSystemInfo({
        success: (res) => {
          resolve(res);
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  },

  // 检查网络状态
  getNetworkType() {
    return new Promise((resolve, reject) => {
      uni.getNetworkType({
        success: (res) => {
          resolve(res.networkType);
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  }
};

export default platform;